package errors

import "gitee.com/vrv_media/go-micro-framework/pkg/code"

// ParseCoder 将任何错误解析为*withCode
// 空错误将直接返回nil
// 没有堆栈信息的错误将被解析为 ErrUnknown
func ParseCoder(err error) code.Coder {
	if err == nil {
		return nil
	}
	// 解析为统一类型 withCode
	if v, ok := err.(*withCode); ok {
		if coder, ok := code.GetByCode(v.Code()); ok {
			return coder
		}
	}

	return code.UnknownCoder
}

// IsCode 函数会检查err链中是否包含给定的错误代码，如果有则返回true，否则返回false
func IsCode(err error, code int) bool {
	if v, ok := err.(*withCode); ok {
		if v.code == code {
			return true
		}

		if v.cause != nil {
			return IsCode(v.cause, code)
		}

		return false
	}

	return false
}
